package com.xframe.common.core.aop;



import com.xframe.domain.repository.SysBaseRepository;
import com.xframe.domain.role.IUserCredentials;

import java.lang.reflect.Method;


/**
 * AOP执行上下文
 *
 * @author xufeng
 * @version 1.0
 * @date 2022-09-28
 */
public class XAOPContext {
    /**
     * 反射执行的对象
     */
    private Object execObj;
    /**
     * 反射执行的对象上所属的方法对象
     */
    private Method method;
    /**
     * 方法执行的参数列表
     */
    private Object[] parArray;
    /**
     * 当前上下文中存储库对象
     */
    private SysBaseRepository repository;
    /**
     * 当前上下文中用户凭证
     */
    private IUserCredentials userCredentials;

    /**
     * 方法的执行结果
     */
    private Object execResault;

    /**
     * 构造函数
     * @param execObj 反射执行的对象
     * @param repository 当前上下文中存储库对象
     * @param method 反射执行的对象上所属的方法对象
     * @param parArray 方法执行参数列表
     * @param userCredentials 当前上下文中用户凭证
     */
    public XAOPContext(Object execObj,SysBaseRepository repository,Method method,Object[] parArray,IUserCredentials userCredentials){
        this.execObj = execObj;
        this.repository = repository;
        this.method = method;
        this.parArray = parArray;
        this.userCredentials = userCredentials;
        this.execResault = null;
    }
    /**
     * 反射执行的对象
     */
    public Object getExecObj() {
        return execObj;
    }
    /**
     * 反射执行的对象上所属的方法对象
     */
    public Method getMethod() {
        return method;
    }
    /**
     * 方法的执行参数列表
     */
    public Object[] getParArray() {
        return parArray;
    }
    /**
     * 当前上下文中用户凭证
     */
    public IUserCredentials getUserCredentials() {
        return userCredentials;
    }
    /**
     * 当前上下文中存储库对象
     */
    public SysBaseRepository getRepository() {
        return repository;
    }
    /**
     * 获得指定类型的参数对象
     */
    public <T> T getPatArrayByType(Class<?> dataType){
        for(Object par : this.parArray){
            if(dataType.isAssignableFrom(par.getClass())){
                return (T) par;
            }
        }
        return null;
    }
    /**
     * 获得方法的执行结果
     */
    public Object getExecResault() {
        return execResault;
    }
    /**
     * 设置方法的执行结果
     * @param execResault 执行结果
     */
    public void setExecResault(Object execResault) {
        this.execResault = execResault;
    }
}
